//
// Created by IL-CH on 2024/6/13.
//
/**
设曲线方程f(x)=0在区间[a,b]上连续，如果f(a)f(b)<0，则方程在区间内至少存在一个根r，使得f(r)=0.现在要求用二分法编写一个求解各类一元方程方程在给定区间解的通用函数，调用该函数来求下列三个方程在区间[a,b]上的解.

(1) x^2−5=0

(2) x^3−5=0

(3) sinx=0

要求：编写的函数要能判断在给定区间上是否有解，如果有解按照二分法进行求解，如果无解函数返回一个实数值-32768作为无解的标志。

函数接口定义：
double bisection(double (*f)(),double a,double b)
其中 参数f是一个指向函数的指针变量。参数 a 和b是解区间的两个端点，函数的返回值为方程在区间上的解。

裁判测试程序样例：
#include <stdio.h>
#include <math.h>
double quadratic(double x)  一个一元二次函数f
{
return x*x-5;
}
double cubic(double x)  一个一元三次函数f
{
    return x*x*x-5;
}
你编写的二分法解方程的函数放在这里
int main()
{
    double x;
    double a,b;
    scanf("%lf%lf",&a,&b);        //输入解区间左右端点的值
    x=bisection(quadratic,a,b); //解一元二次方程
    printf("%.3f\n",x);
    x=bisection(cubic,a,b);        //解一元三次方程
    printf("%.3f\n",x);
    x=bisection(sin,a,b);            //求解方程sinx=0
    printf("%.3f\n",x);
    return 0;
}
输入样例1：
以下输入的两个数是区间[a,b]的端点

1.0 4.0
输出样例1：
2.236
1.710
3.142
输入样例2：
以下输入的两个数是区间[a,b]的端点

4.0 6.0
输出样例2：
-32768.000
-32768.000
-32768.000
*/
#include <stdio.h>
#include <math.h>
double quadratic(double x)  /*一个一元二次函数f*/
{
    return x*x-5;
}
double cubic(double x)  /*一个一元三次函数f*/
{
    return x*x*x-5;
}
/* 你编写的二分法解方程的函数放在这里   */
double bisection(double (*f)(), double a, double b)
{
    double middle;
    if ((*f)(a) * (*f)(b) > 0)
        return -32768.0;

    do
    {
        middle = (a + b) / 2.0;
        if ((*f)(middle) * (*f)(a) > 0)
            a = middle;
        else
            b = middle;
    } while (fabs((*f)(middle)) >= 1e-7);

    return middle;
}
int main()
{
    double x;
    double a,b;
    scanf("%lf%lf",&a,&b);        //输入解区间左右端点的值
    x=bisection(quadratic,a,b); //解一元二次方程
    printf("%.3f\n",x);
    x=bisection(cubic,a,b);        //解一元三次方程
    printf("%.3f\n",x);
    x=bisection(sin,a,b);            //求解方程sinx=0
    printf("%.3f\n",x);
    return 0;
}